package com.aier.common.common;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.imageio.ImageIO;

import net.eicp.ghostboy.futil.MD5Util;
import net.eicp.ghostboy.futil.RandomUtil;

import org.aspectj.util.FileUtil;

public class ImageUtil {


    public static Date formatYMD(String ymd) throws ParseException{
        return new SimpleDateFormat("yyyy-MM-dd").parse(ymd);
    }
    
    /**
     * 上传图片
     * @return
     */
    public static String uploadImage(File image,String imageUrl,String imageName,Integer type) {
        //String picName = "";
        // 图片文件名字（MD5+随机数，防止重名）
        String fileName = "";
        if (null != image) {
            if ("gif".equals(getExt(imageName))) {
                
                fileName = MD5Util.getMD5(String.valueOf(new Date().getTime())).substring(0, Constant.num_10) + 
                        RandomUtil.genRandomNum(Constant.num_8, RandomUtil.PWD_TYPE_NUM_AND_CHAR)+".gif";
            } else {
                fileName = MD5Util.getMD5(String.valueOf(new Date().getTime())).substring(0, Constant.num_10) + 
                        RandomUtil.genRandomNum(Constant.num_8, RandomUtil.PWD_TYPE_NUM_AND_CHAR)+".jpg";
            }
            
            // 图片需要压缩
            if (type == 1) {
                // 文件目录不存在，则创建目录
                File fo = new File(imageUrl+"origin/");
                if (!fo.exists()) {
                    fo.mkdirs();
                }
                // 保存原文件
                String fileurl = imageUrl+"origin/"+fileName;
                try {
                    FileUtil.copyFile(image, new File(fileurl));
                } catch (Exception e) {
                    e.printStackTrace();
                    fileName = "";
                }
                File fs = new File(imageUrl+"small/");
                if (!fs.exists()) {
                    fs.mkdirs();
                }
                File fb = new File(imageUrl+"big/");
                if (!fb.exists()) {
                    fb.mkdirs();
                }
                
                // 压缩文件并保存
                compressPic(imageUrl, fileName, Constant.num_100, Constant.num_100, true,"small");
                compressPic(imageUrl, fileName, Constant.num_440, Constant.num_440, true,"big");
            } else {
                // 图片不需要压缩
                // 文件目录不存在，则创建目录
                File fo = new File(imageUrl);
                if (!fo.exists()) {
                    fo.mkdirs();
                }
                // 保存原文件
                String fileurl = imageUrl + fileName;
                try {
                    FileUtil.copyFile(image, new File(fileurl));
                } catch (Exception e) {
                    e.printStackTrace();
                    fileName = "";
                }
            }
            
//            if (!"".equals(picName)) {
//                picName += ",";
//            }
//            picName += fileName;
        }
        return fileName;
    }
    
 
    /**
     * 上传并压缩图片 上传图片可调整压缩图片大小
     * @param image 图片文件
     * @param imageUrl 图片上传路径
     * @param imageName 图片原名
     * @param smallOutputWidth 压缩之后小图的宽
     * @param smallOutputHeight 压缩之后小图的高
     * @param bigOutputWidth 压缩之后大图的宽
     * @param bigOutputHeight 压缩之后大图的高
     * @param isProRata 是否按比例压缩
     * @return 上传之后的文件名
     */
    public static String uploadImageAdjustable(File image, String imageUrl,
            String imageName, Integer smallOutputWidth,
            Integer smallOutputHeight, Integer bigOutputWidth,
            Integer bigOutputHeight,Boolean isProRata) {
        String picName = "";
        if (null != image) {

            // 图片文件名字（随机数，防止重名）
            String fileName = "";

            if ("gif".equals(getExt(imageName))) {
                fileName = new Date().getTime()
                        + RandomUtil.genRandomNum(Constant.num_8,
                                RandomUtil.PWD_TYPE_NUM_AND_CHAR) + ".gif";
            } else {
                fileName = new Date().getTime()
                        + RandomUtil.genRandomNum(Constant.num_8,
                                RandomUtil.PWD_TYPE_NUM_AND_CHAR) + ".jpg";
            }

            // 文件目录不存在，则创建目录
            File fo = new File(imageUrl + "origin/");
            if (!fo.exists()) {
                fo.mkdirs();
            }
            // 保存原文件
            String fileurl = imageUrl + "origin/" + fileName;
            try {
                FileUtil.copyFile(image, new File(fileurl));
            } catch (Exception e) {
                e.printStackTrace();
                fileName = "";
            }
            File fs = new File(imageUrl + "small/");
            if (!fs.exists()) {
                fs.mkdirs();
            }
            File fb = new File(imageUrl + "big/");
            if (!fb.exists()) {
                fb.mkdirs();
            }

            // 压缩文件并保存
            compressPic(imageUrl, fileName, smallOutputHeight,smallOutputHeight, isProRata,"small");
            
            compressPic(imageUrl, fileName, bigOutputHeight, bigOutputHeight,isProRata,"big");
            
            

            if (!"".equals(picName)) {
                picName += ",";
            }
            picName += fileName;
        }
        return picName;
    }

    /**
     * 压缩图片
     * 
     * @param inputDir
     *            原图路径
     * @param inputFileName
     *            图片名称
     * @param width
     *            压缩后图的宽度
     * @param height
     *            压缩后的高度
     * @param proportion
     *            是否等比缩放
     * @param size
     *            是压缩成大图还是小图   big/small
     * @return
     */
    public static String compressPic(String inputDir, String inputFileName,
            int outputWidth, int outputHeight, boolean proportion,String size) {
        try {
            // 获得源文件
            File file = new File(inputDir + "origin/" + inputFileName);
            if (!file.exists()) {
                return "no";
            }
            Image img = ImageIO.read(file);
            // 判断图片格式是否正确
            if (img.getWidth(null) == -1) {
                return "no";
            }

            int newWidth;
            int newHeight;
            // 判断是否是等比缩放
            if (proportion) {
                // 为等比缩放计算输出的图片宽度及高度
                double rate1 = ((double) img.getWidth(null))
                        / (double) outputWidth;
                double rate2 = ((double) img.getHeight(null))
                        / (double) outputHeight;
                // 根据缩放比率大的进行缩放控制
                if (rate1 < 1 && rate2 < 1) {
                    // 原图小于输出图
                    newWidth = img.getWidth(null);
                    newHeight = img.getHeight(null);
                } else {
                    if (size.equalsIgnoreCase("small")) {
                        // 压小图
                        double rate = rate1 > rate2 ? rate1 : rate2;
                        newWidth = (int) (img.getWidth(null) / rate);
                        newHeight = (int) (img.getHeight(null) / rate);
                        if (newWidth == 0) {
                            newWidth = 2;
                        }
                        if (newHeight == 0) {
                            newHeight = 2;
                        }
                    } else {
                        // 压大图
                        if (rate1<1) {
                            // 宽度小于输出宽度，则不压缩
                            newWidth = img.getWidth(null);
                            newHeight = img.getHeight(null);
                        } else {
                            // 已宽度为准
                            newWidth = (int) (img.getWidth(null) / rate1);
                            newHeight = (int) (img.getHeight(null) / rate1);
                            if (newWidth == 0) {
                                newWidth = 2;
                            }
                            if (newHeight == 0) {
                                newHeight = 2;
                            }
                        }
                        
                    }
                    
                }

            } else {
                newWidth = outputWidth; // 输出的图片宽度
                newHeight = outputHeight; // 输出的图片高度
            }

            String outputDir = "";
            if (size.equalsIgnoreCase("big")) {
                outputDir = inputDir + "big/" + inputFileName;
            } else if(size.equalsIgnoreCase("small")){
                outputDir = inputDir + "small/" + inputFileName;
            }

            // gif图片处理
            if ("gif".equalsIgnoreCase(getExt(inputFileName))
                    && size.equalsIgnoreCase("big")) {
                // gif不压缩
                try {
                    FileUtil.copyFile(file, new File(outputDir));
                } catch (Exception e) {
                    e.printStackTrace();
                }
                
                
//                File ft = new File(inputDir + "temp");
//                if (!ft.exists()) {
//                    ft.mkdirs();
//                }
//                String[] pic = ImageSpek.splitGif(inputDir + "origin/"
//                        + inputFileName, inputDir + "temp");
//                System.out.println("=================pic="+pic);
//                System.out.println("=================pic.length="+pic.length);
//                for (int i = 0; i < pic.length; i++) {
//                    ImageSpek.compressPic(inputDir + "temp", inputDir + "temp",
//                            i + ".jpg", +i + ".jpg", outputWidth, outputWidth,
//                            true);
//                    pic[i] = inputDir + "temp" + "/" + i + ".jpg";
//                    System.out.println("=========rrrrrr========pic[i]="+pic[i]);
//                }
//                System.out.println("==============end======================");
//                ImageSpek.jpgToGif(pic, outputDir);
//                ImageSpek.delAllFile(inputDir + "temp");
                
            } else {
                
                // 其他格式图片处理
                BufferedImage tag = new BufferedImage(newWidth, newHeight,
                        BufferedImage.TYPE_INT_RGB);
                Graphics g = tag.createGraphics();
                g.setColor(Color.white);
                g.fillRect(0, 0, newWidth, newHeight);
                g.drawImage(img, 0, 0, newWidth, newHeight, null);
                g.dispose();
                FileOutputStream out = new FileOutputStream(outputDir);
                ImageIO.write(tag, "jpg", out);  
                out.close();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return "ok";
    }

    /**
     * 压缩图片---刷卡专用
     * 
     * @param inputDir
     *            原图路径
     * @param inputFileName
     *            图片名称
     * @param width
     *            压缩后图的宽度
     * @param height
     *            压缩后的高度
     * @param proportion
     *            是否等比缩放
     * @param size
     *            是压缩成大图还是小图   big/small
     * @return
     */
    public static String compressPic_card(String inputDir, String inputFileName,
            int outputWidth, int outputHeight, boolean proportion,String size) {
        try {
            // 获得源文件
            File file = new File(inputDir + inputFileName);
            if (!file.exists()) {
                return "no";
            }
            Image img = ImageIO.read(file);
            // 判断图片格式是否正确
            if (null == img ||img.getWidth(null) == -1) {
                return "no";
            }

            int newWidth;
            int newHeight;
            // 判断是否是等比缩放
            if (proportion) {
                // 为等比缩放计算输出的图片宽度及高度
                double rate1 = ((double) img.getWidth(null))
                        / (double) outputWidth;
                double rate2 = ((double) img.getHeight(null))
                        / (double) outputHeight;
                // 根据缩放比率大的进行缩放控制
                if (rate1 < 1 && rate2 < 1) {
                    // 原图小于输出图
                    newWidth = img.getWidth(null);
                    newHeight = img.getHeight(null);
                } else {
                    if (size.equalsIgnoreCase("small")) {
                        // 压小图
                        double rate = rate1 > rate2 ? rate1 : rate2;
                        newWidth = (int) (img.getWidth(null) / rate);
                        newHeight = (int) (img.getHeight(null) / rate);
                        if (newWidth == 0) {
                            newWidth = 2;
                        }
                        if (newHeight == 0) {
                            newHeight = 2;
                        }
                    } else {
                        // 压大图
                        if (rate1<1) {
                            // 宽度小于输出宽度，则不压缩
                            newWidth = img.getWidth(null);
                            newHeight = img.getHeight(null);
                        } else {
                            // 已宽度为准
                            newWidth = (int) (img.getWidth(null) / rate1);
                            newHeight = (int) (img.getHeight(null) / rate1);
                            if (newWidth == 0) {
                                newWidth = 2;
                            }
                            if (newHeight == 0) {
                                newHeight = 2;
                            }
                        }
                        
                    }
                    
                }

            } else {
                newWidth = outputWidth; // 输出的图片宽度
                newHeight = outputHeight; // 输出的图片高度
            }

            String outputDir = "";
            if (size.equalsIgnoreCase("big")) {
                outputDir = inputDir + "big/" + inputFileName;
            } else if(size.equalsIgnoreCase("small")){
                outputDir = inputDir + "small/" + inputFileName;
            }

            // 其他格式图片处理
            BufferedImage tag = new BufferedImage(newWidth, newHeight,
                    BufferedImage.TYPE_INT_RGB);
            Graphics g = tag.createGraphics();
            g.setColor(Color.white);
            g.fillRect(0, 0, newWidth, newHeight);
            g.drawImage(img, 0, 0, newWidth, newHeight, null);
            g.dispose();
            FileOutputStream out = new FileOutputStream(outputDir);
            ImageIO.write(tag, "jpg", out);  
            out.close();
            
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return "ok";
    }
    
    /**
     * 获得文件后缀
     * 
     * @param filename
     * @return
     */
    public static String getExt(String filename) {
        return filename.substring(filename.lastIndexOf('.') + 1).toLowerCase();
    }

    /**
     * 剪切用户头像
     * 
     * @param url
     *            图片上传路径
     * @param pname
     *            图片数据库中的名称
     * @param x
     *            截取的坐标
     * @param y
     *            截取的坐标
     * @param w
     *            截取的坐标
     * @param h
     *            截取的坐标
     * @return
     */
    public static int cutImg(String url, String pname, int x, int y, int w,
            int h) {
        try {

            Image img;
            ImageFilter cropFilter;
            // 读取源图像
            String imgpath = url + pname;
            BufferedImage bi = ImageIO.read(new File(imgpath));
            int srcWidth = bi.getWidth(); // 源图宽度
            int srcHeight = bi.getHeight(); // 源图高度

            Image image = bi.getScaledInstance(srcWidth, srcHeight,
                    Image.SCALE_DEFAULT);
            /**
             * **************************************** 判断原图的宽高和DIV宽高的大小
             * 根据图片外层DIV的宽度，选择的起始点则有相对变化
             *************************************** */
            int x1 = x * srcWidth /Constant.num_350;
            int y1 = y * srcHeight / Constant.num_350;
            int w1 = w * srcWidth / Constant.num_350;
            int h1 = h * srcHeight / Constant.num_350;
            // 四个参数分别为图像起点坐标和宽高
            // 即: CropImageFilter(int x,int y,int width,int height)
            cropFilter = new CropImageFilter(x1, y1, w1, h1);
            img = Toolkit.getDefaultToolkit().createImage(
                    new FilteredImageSource(image.getSource(), cropFilter));
            BufferedImage tag = new BufferedImage(w1, h1,
                    BufferedImage.TYPE_INT_RGB);
            Graphics g = tag.getGraphics();
            g.drawImage(img, 0, 0, null); // 绘制缩小后的图
            g.dispose();
            // 输出为文件
            ImageIO.write(tag, "JPEG", new File(imgpath));

            // 文件目录不存在，则创建目录
            File fo = new File(url + "origin/");
            if (!fo.exists()) {
                fo.mkdirs();
            }
            // 保存原文件
            String fileurl = url + "origin/" + pname;
            try {
                FileUtil.copyFile(new File(imgpath), new File(fileurl));
            } catch (Exception e) {
                e.printStackTrace();
                pname = "";
            }
            File fs = new File(url + "small/");
            if (!fs.exists()) {
                fs.mkdirs();
            }
            File fb = new File(url + "big/");
            if (!fb.exists()) {
                fb.mkdirs();
            }

            // 压缩文件并保存
            compressPic(url, pname, Constant.num_100, Constant.num_100, true,"small");
            compressPic(url, pname, Constant.num_200, Constant.num_200, true,"big");

            return 1;

        } catch (Exception e) {
            return 0;

        }

    }
}
